package com.ys.service.business.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ys.dto.EditDto;
import com.ys.entity.business.TpProductBq;
import com.ys.entity.business.TpProductBqSp;
import com.ys.entity.business.TpProductBqSpZj;
import com.ys.entity.business.TpProductMaterial;
import com.ys.entity.sys.YsCol;
import com.ys.enume.business.TpProductMaterialEnum;
import com.ys.mapper.business.BusinessMapper;
import com.ys.mapper.business.TpProductBqSpMapper;
import com.ys.mapper.business.TpProductBqSpZjMapper;
import com.ys.mapper.business.TpProductMaterialMapper;
import com.ys.service.business.TpProductBqSpService;
import com.ys.service.flow.YspTaskService;
import com.ys.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;


/**
 * 商品备案申请商品
 */
@Service("TpProductBqSpService")
public class TpProductBqSpServiceImpl implements TpProductBqSpService {

    @Autowired
    private BusinessMapper businessMapper;
    @Autowired
    private TpProductBqSpZjMapper tpProductBqSpZjMapper;

    @Autowired
    private TpProductBqSpMapper tpProductBqSpMapper;

    @Autowired
    private TpProductMaterialMapper tpProductMaterialMapper;

    @Autowired
    private YspTaskService yspTaskService;


    /**
     * 商品备案申请新增
     */
    @Override
    @Transactional(timeout=120,propagation= Propagation.REQUIRES_NEW)
    public R update(Map<String, Object> params, String subData) throws Exception {
        // 验证是否有子件列表
        JSONArray detailJA = JSON.parseArray(subData);
        if (detailJA == null || detailJA.size() == 0) {
            return R.error("子件列表不能为空");
        }
        String errorMsg = checkParams(params,10183L);
        if(errorMsg!=null && !"".equals(errorMsg)){
            return R.error(errorMsg);
        }

        TpProductBqSp tpProductBqSp = JSON.parseObject(JSON.toJSONString(params), TpProductBqSp.class);
        if (tpProductBqSp.getVsfJp().equals("是")){
            if (tpProductBqSp.getCommodityPlId() == null){
                return R.error("该商品属性是精品,商品品类不允许为空!");
            }
        }
        TpProductBqSp tpProductBqSp1 = new TpProductBqSp().setId(tpProductBqSp.getId()).queryFirst();
        TpProductBq tpProductBq = new TpProductBq().setId(tpProductBqSp1.getPid()).queryFirst();
        if (tpProductBq == null){
            return R.error("商品备案申请单不存在!");
        }
        //判断是否实在制单中
        Integer flowState = yspTaskService.flowState(tpProductBq.getBid());

        if (flowState != 0){
            return R.error("商品备案申请单不是制单中,不允许保存!");
        }
        
        /*
         * 更新商品材质
         */
        // 清除旧的商品材质
        businessMapper.deleteTrueTpProductMaterial(tpProductBqSp.getCode(), TpProductMaterialEnum.Type.TP_ProductBqSp.value);
        String materialCnArr = params.get("materialCn").toString();
        String materialEnArr = params.get("materialEn").toString();
        String materialIdArr = params.get("materialId").toString();
        // 逐条新增商品材质
        String[] materialCnJA = materialCnArr.split(",");
        String[] materialEnJA = materialEnArr.split(",");
        String[] materialIdJA = materialIdArr.split(",");
        for (int j = 0; j < materialCnJA.length; j++) {
            Integer type = TpProductMaterialEnum.Type.TP_ProductBqSp.value;
            String productCode = tpProductBqSp.getCode();
            Long materialId = Long.valueOf(materialIdJA[j]);
            String materialNameCn = materialCnJA[j];
            String materialNameEn = materialEnJA[j];
            TpProductMaterial tpProductMaterial = TpProductMaterial.tpProductMaterial(type, productCode, materialId, materialNameCn, materialNameEn, 1);
            tpProductMaterialMapper.insert(tpProductMaterial);
        }

        
        /*
         * 更新商品详情
         */
        tpProductBqSp.setIsEdit(1);
        tpProductBqSpMapper.update(tpProductBqSp);

        // 修改新增子件明细
        for (int i = 0; i < detailJA.size(); i++) {
            JSONObject detailJO = detailJA.getJSONObject(i);
            TpProductBqSpZj tpProductBqSpZj = JSON.parseObject(JSON.toJSONString(detailJO), TpProductBqSpZj.class);
            tpProductBqSpZj.setPid(tpProductBqSp.getId());
            R yzcs = yzcs(tpProductBqSpZj);
            if (yzcs.getCode().equals(1)){
                return yzcs;
            }

            //查询商品编码
            try {
                if (tpProductBqSpZj.getId() == null) {
                    //查询最大的一条编号
                    List<TpProductBqSpZj> tpProductBqSpZjList = new TpProductBqSpZj().setPid(tpProductBqSp.getId()).setOrderby("A.CurrentNo DESC").queryList();
                    Integer currentNo = 0;
                    if (tpProductBqSpZjList.size() != 0){
                        currentNo = tpProductBqSpZjList.get(0).getCurrentNo();
                    }
                    currentNo++;
                    String currentNoNew = String.format("%02d",currentNo);
                    //商品编码-01，-02，-03.....
                    tpProductBqSpZj.setCode(tpProductBqSp.getCode()+"-"+currentNoNew);
                    // 验证订单号
                    if (new TpProductBqSpZj().setCode(tpProductBqSpZj.getCode()).count() > 0) {
                        return R.error("子件编码已存在");
                    }
                    tpProductBqSpZj.setCurrentNo(currentNo);
                    tpProductBqSpZjMapper.insert(tpProductBqSpZj);
                } else {
                    tpProductBqSpZjMapper.update(tpProductBqSpZj);
                }
            } catch (Exception e) {
                return R.error("修改子件信息失败!");
            }
        }
//        return R.ok(AddDto.gotoEdit("/web/business/tpProductBqSp/toEdit?id=" + tpProductBqSp.getId()));
        return R.ok(EditDto.closeAndReload());
    }

    /**
     * 删除
     */
    @Override
    @Transactional(timeout=120,propagation= Propagation.REQUIRES_NEW)
    public R del(List<String> idList,String code) {
        try {
            TpProductBqSp tpProductBqSp = new TpProductBqSp().setCode(code).queryFirst();
            if (tpProductBqSp == null){
                return R.error("商品备案申请单商品信息不存在,不允许删除!");
            }
            TpProductBq tpProductBq = new TpProductBq().setId(tpProductBqSp.getPid()).queryFirst();
            if (tpProductBq == null){
                return R.error("商品备案申请单不存在,不允许删除!");
            }

            //判断是否实在制单中
            Integer flowState = yspTaskService.flowState(tpProductBq.getBid());

            if (flowState != 0){
                return R.error("商品备案申请单不是制单中,不允许删除!");
            }
            //查询所有的子件
            List<TpProductBqSpZj> tpProductBqSpZjList = new TpProductBqSpZj().setPcode(tpProductBqSp.getCode()).setOrderby("A.Id DESC").queryList();

            Collections.sort(idList, Collections.reverseOrder());
            List<TpProductBqSpZj> tpProductBqSpZjListNew;
            for (String id :idList){
                tpProductBqSpZjListNew = tpProductBqSpZjList.stream().filter(tpProductBqSpZj -> tpProductBqSpZj.getId() > Long.parseLong(id)).collect(Collectors.toList());
                if (tpProductBqSpZjListNew.size() != 0){
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    return R.error("删除失败,子件信息删除必须按照顺序删除!");
                }
                tpProductBqSpZjMapper.deleteTrue(Long.parseLong(id));
            }

        } catch (Exception e) {
            return R.error("删除失败!");
        }
        return R.ok("删除成功!");
    }

    /**
     * 参数验证
     */
    public String checkParams(Map<String, Object> params,Long menuId) throws Exception {
        Predicate<Object> isNotNull = item-> item!=null && !"".equals(item.toString().trim());//是否为空，返回：非空true，空false
        String backMsg = "";
        if(params==null){
            return "参数为空！";
        }
        //获取pc字段数据
        List<YsCol> listField = new YsCol()
                .where("A.MenuId = "+menuId)
                .setOrderby("A.SortNo ASC")
                .queryList();
        String code = "";
        if(listField!=null && listField.size()>0){
            for(YsCol item:listField){
                if (params.get(item.getCode()) != null){
                    code = params.get(item.getCode()).toString();
                }
                if (!backMsg.equals("") ){
                    return backMsg;
                }
                if (code.equals("") ){
                    continue;
                }
                if (item.getFormEditRequired() == 1){
                    if(!isNotNull.test(params.get(item.getCode()))){
                        backMsg = item.getName()+"为空！";
                    }
                }
                //商品名称
                if (item.getCode().equals("name")){
                    if (code.length() > 100){
                        backMsg = item.getName()+"长度不能大于100！";
                    }
                }
                //竞品卖家
                if (item.getCode().equals("solderJP")){
                    if (code.length() > 20){
                        backMsg = item.getName()+"长度不能大于20！";
                    }
                }
                //商品备注|商品组合
                if (item.getCode().equals("commodityRemark") || item.getCode().equals("combination")){
                    if (code.length() > 100){
                        backMsg = item.getName()+"长度不能大于100！";
                    }
                }
                //海关编码|竞品评论数|竞品排行
                if (item.getCode().equals("codeHs") || item.getCode().equals("ratingJP")|| item.getCode().equals("rankOneJP") ){
                    if (!code.matches("[0-9]\\d*")){
                        backMsg = item.getName()+"格式需要是数字，无小数点！";
                    }else if (code.length() > 15){
                        backMsg = item.getName()+"长度不能大于15！";
                    }
                }
                //商品长度|宽度|高度|重量|建议售价|FBA预估费用|FBA物流费用|FBA佣金比
                // |空运预算成本(￥)|海运预算成本(￥)|空运投入产出比(%)|海运预算毛利率(%)
                // |空运投入产出比(%)|海运投入产出比(%)|竞品售价
                if (item.getCode().equals("sizeLength") || item.getCode().equals("sizeWidth") || item.getCode().equals("sizeHeight")|| item.getCode().equals("sizeWeight")
                ||item.getCode().equals("fjySj")||item.getCode().equals("fygFy")||item.getCode().equals("fwlYgFy")||item.getCode().equals("fyjb")
                        ||item.getCode().equals("fcbK") ||item.getCode().equals("fcbH") ||item.getCode().equals("fmllK") ||item.getCode().equals("fmllH")
                        ||item.getCode().equals("fTcbK")||item.getCode().equals("fTcbH")||item.getCode().equals("priceJP")){
                    if (!code.matches("\\d+(\\.\\d{0,2})?")){
                        backMsg = item.getName()+"格式需要是数值，两位小数点！";
                    }else if (code.length() > 15){
                        backMsg = item.getName()+"长度不能大于15！";
                    }
                }
                //采购链接|竞品链接地址
                if (item.getCode().equals("linkIn") || item.getCode().equals("")){
                    if (code.length() > 500){
                        backMsg = item.getName()+"长度不能大于500！";
                    }
                }

                //竞品ASIN
                if (item.getCode().equals("asinJP")){
                    if (!code.matches("[a-zA-Z0-9]+")){
                        backMsg = item.getName()+"格式需要是字母数字！";
                    }else if (code.length() > 100){
                        backMsg = item.getName()+"长度不能大于100！";
                    }
                }
                //竞品标题|竞品备注
                if (item.getCode().equals("titleJP") || item.getCode().equals("remarkJP") ){
                    if (code.length() > 100){
                        backMsg = item.getName()+"长度不能大于100！";
                    }
                }
                //竞品评分
                if (item.getCode().equals("scoreJP")  ){
                    if (!code.matches("\\d+(\\.\\d{0,1})?")){
                        backMsg = item.getName()+"格式需要是数值，一位小数点！";
                    }else if (code.length() > 15){
                        backMsg = item.getName()+"长度不能大于15！";
                    }
                }
            }
        }
        return backMsg;
    }

    /**
     * 新增验证参数
     */
    public R yzcs(TpProductBqSpZj tpProductBqSpZj){
        //验证
        if (tpProductBqSpZj.getName().length() == 0){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件名称为空,保存失败!");
        }else if (tpProductBqSpZj.getName().length() > 400){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件名称长度不允许超过400个字符,保存失败!");
        }

        if (!tpProductBqSpZj.getNum().toString().matches("\\d+(\\.\\d{0,2})?")){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件数量格式需要是数值，两位小数点！");
        }else if (tpProductBqSpZj.getNum().toString().length() > 15){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件数量格式长度不能大于15");
        }
        if (!tpProductBqSpZj.getBprice().toString().matches("\\d+(\\.\\d{0,2})?")){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件单价格式需要是数值，两位小数点！");
        }else if (tpProductBqSpZj.getBprice().toString().length() > 15){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("子件单价格式长度不能大于15");
        }

        if (tpProductBqSpZj.getLinkIn().length() > 1000){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("采购链接长度不允许超过1000个字符,保存失败!");
        }
        //铺货标识
        if (!tpProductBqSpZj.getLinkInMark().matches("[0-9]\\d*")){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("铺货标识格式需要是数字，无小数点！");
        }else if (tpProductBqSpZj.getLinkInMark().length() > 15){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return R.error("铺货标识格式长度不能大于15");
        }
        if (tpProductBqSpZj.getRemark() != null){
            if (tpProductBqSpZj.getRemark().length() > 200){
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return R.error("子件备注长度不允许超过200个字符,保存失败!");
            }
        }
        return R.ok();
    }
}
